package com.rankeiot.core.config;

import com.rankeiot.core.Config;
import com.rankeiot.core.util.CollectionUtil;
import com.rankeiot.core.util.LocaleUtil;
import com.rankeiot.core.util.StringUtil;
import com.rankeiot.core.util.TokenUtil;
import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
public class ConfigManager {
    private static Map<String, List<ConfigItemMeta>> metas = new HashMap<>();

    public static synchronized void register(String group, Class<? extends Enum> config) {
        Field[] fields = config.getDeclaredFields();
        List<ConfigItemMeta> itemMetas = metas.get(group);
        if (itemMetas == null) {
            itemMetas = new ArrayList<>();
            metas.put(group, itemMetas);
        }
        Map<String,ConfigItemMeta> oldMap = CollectionUtil.toKeyMap(itemMetas,ConfigItemMeta::getSn);
        for (Field f : fields) {
            if (!f.isEnumConstant()) {
                continue;
            }
            Item cfi = f.getAnnotation(Item.class);
            if (cfi == null) {
                continue;
            }
            try {
                IConfigItem item = (IConfigItem) f.get(config);
                //防止多次注册相同项目
                if(oldMap.containsKey(item.fullName())){
                    log.warn("已注册了相同的配置项:{}-{}",item.fullName(),cfi.title());
                    continue;
                }
                ConfigItemMeta meta = new ConfigItemMeta();
                meta.setSn(item.fullName());
                meta.setControl(cfi.type().name());
                meta.setTitle(LocaleUtil.encode(cfi.title(),cfi.en()));
                meta.setDataUrl(cfi.dataUri());
                meta.setFront(cfi.front());
                meta.setMemo(cfi.memo());

                itemMetas.add(meta);
                if (StringUtil.isNotEmpty(cfi.defaultValue())) {
                    meta.setDefaultValue(cfi.defaultValue());
                    String value = Config.getStr(meta.getSn());
                    if (StringUtil.isEmpty(value)) {
                        Config.configMap().put(meta.getSn(), cfi.defaultValue());
                    }
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }

        }
    }

    public static Map<String, List<ConfigItemMeta>> getMetas() {
        return metas;
    }

    public static Map<String, String> getFrontConfigs() {
        Map<String, String> map = new HashMap<>();
        for (List<ConfigItemMeta> mts : metas.values()) {
            for (ConfigItemMeta meta : mts) {
                if (meta.isFront()) {
                    map.put(meta.getSn(), Config.getStr(meta.getSn()));
                }
            }
        }
        map.put("_appSign", TokenUtil.getGlobalSalt());
        return map;
    }
    public static Map<String, String> allConfigs() {
        Map<String, String> map = new HashMap<>();
        for (List<ConfigItemMeta> mts : metas.values()) {
            for (ConfigItemMeta meta : mts) {
                map.put(meta.getSn(), Config.getStr(meta.getSn()));
            }
        }
        map.put("_appSign", TokenUtil.getGlobalSalt());
        return map;
    }
}
